#!c:/perl/bin/perl.exe
##########################################################################################################################
##### a script to add object permissions for Users of Wigan-Warriors.com
##########################################################################################################################

##########################################################################################################################
######  TODO list  #######################################################################################################
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
###### Bug list
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
# Includes
##########################################################################################################################

use lib qw(../cgi-bin);
use Sys::Hostname;
use Time::Local qw(timelocal);
use CGI;

use Diva::DB;
use Diva::DataObject;
use WiganRL::DataObject qw(:constants);
use WiganRL::DataObject::News;
use WiganRL::Search;

use Getopt::Long;

use Lingua::EN::Keywords;
use HTML::Strip;

use strict;
#use warnings;

$|++;  #unbuffered

##########################################################################################################################
# get arguments
##########################################################################################################################

WiganRL::DataObject->init_class();
WiganRL::Search->init_class();

##########################################################################################################################
# site setup and location variable declarations
##########################################################################################################################
my $host= hostname;
my ($SITE_BASE_URL,$SITE_BASE_DIR,$CGI_BASE_URL,$CGI_BASE_DIR,$EMAIL_BASE_DIR,$MAIL_SMTP_SERVER);
my ($SEND_EMAILS,$ADMIN_NAME,$ADMIN_EMAIL,$MAIL_SCRIPT,$SITE_DATA_DIR);

if ($host=~ /MIKE/i) {     ### home
	$SITE_BASE_URL= 'http://localhost/wigan';
	$SITE_BASE_DIR= 'c:/mdr/wwcom/v2.0/html';
	$SITE_DATA_DIR= 'c:/mdr/wwcom/v2.0/data';
	$CGI_BASE_URL= 'http://localhost/cgi-bin/wigan';
	$CGI_BASE_DIR= 'c:/mdr/wwcom/v2.0/cgi-bin';
} else {    ##server
	$SITE_BASE_URL= 'http://wigan.smb.man.ac.uk/wigan';
	$SITE_BASE_DIR= 'c:/wwcom/v2.0/html';    
	$SITE_DATA_DIR= 'c:/wwcom/v2.0/data';
	$CGI_BASE_URL= 'http://wigan.smb.man.ac.uk/wigan';
	$CGI_BASE_DIR= 'c:/wwcom/v2.0/cgi-bin';
}

my $cgi= CGI->new();
$cgi->param('CGI_BASE_URL',$CGI_BASE_URL);
$cgi->param('SessionID','');

my $dbh= Diva::DB->new();
$dbh->set( {
	DATABASE_NAME       => 'wwcom',
	DATABASE_SERVER     => 'localhost:3306',
	DATABASE_USERNAME   => 'wwcom',
	DATABASE_PASSWORD   => 'wwcom',
	DATABASE_TYPE       => 'mysql',
	} );
$dbh->connect();
$dbh->debug(0);

WiganRL::DataObject->dbh($dbh);
WiganRL::DataObject->cgi($cgi);
WiganRL::Search->dbh($dbh);
#WiganRL::DataObject::User->dbh($dbh);

#get new content
my $s= WiganRL::Search->new;
$s->table('NEWS');
$s->orderby('RAND()');
my $o= $s->search(1)->[0];
print "ID: ".$o->id;
my $text= $o->data('NEWS_BODY');
my $hs= HTML::Strip->new;
my $text= $hs->parse($text);
$hs->eof;
print "\nBody: $text";
# my $text= summarize( $_->data('NEWS_BODY'), filter => 'html');
my $kws= keywords( $text);
my $kw1= keywords( $text);
#print "\n\nKeywords: @kw1";
	
my $s_kw;
$s->clear; $s->table('NEWS');
$s->where("OBJECT_DATE > '".$o->data('OBJECT_DATE')."' - INTERVAL 3 DAY 
	and OBJECT_DATE < '".$o->data('OBJECT_DATE')."' + INTERVAL 3 DAY
	and FK_OBJECT_ID<>".$o->id);
for(@{$s->search()}) {
	print "ID: ".$_->id;
	my $text= $_->data('NEWS_BODY');
	my $hs= HTML::Strip->new;
	my $text= $hs->parse($text);
	$hs->eof;
	$s_kw->{$_->id}= keywords( $text);
	for my $k (keys %{$s_kw->{$_->id}}) {
		$kws->{$k}+= $s_kw->{$_->id}->{$k};
	}
	#print "\n\nKeywords: @kw";
}
	
print "\nKeywords: ";
for my $k (sort {$kws->{$b} <=> $kws->{$a}} keys %$kws) {
	print "$k ($kws->{$k}), ";
}
	print "\n\n";
#calc distances
my ($best_d, $best_id);
for my $id (keys %$s_kw) {
	my $d= dist($kws,$kw1,$s_kw->{$id});
	if ($d>$best_d) {
		$best_d= $d;
		$best_id= $id;
	}
	print "\nDist to $id: $d";
}

if ($best_d > 0.3) {
	my $o2= WiganRL::DataObject::News->new($best_id);
	print "\n\nOriginal article ".$o->id.": ".$o->data('NEWS_TITLE');
	print "\nMost similar article $best_id: ".$o2->data('NEWS_TITLE')." ($best_d)";
} else {
	print "\n\nOriginal article ".$o->id.": ".$o->data('NEWS_TITLE');
	print "\nNo likely matching articles.";
}
	
sub dist {
	my ($space,$d1,$d2)= @_;
	my $d= 0;
	my @v1;
	my @v2;
	my @keys= sort {$space->{$b} <=> $space->{$a}} keys %$space;
	my $ip= 0;
	my $s1= 0;
	my $s2= 0;
	for (0..$#keys) {
		$v1[$_]= $d1->{$keys[$_]};
		$v2[$_]= $d2->{$keys[$_]};
		$ip+= $v1[$_]*$v2[$_];
		$s1+= $v1[$_]*$v1[$_];
		$s2+= $v2[$_]*$v2[$_];
	}
	$d= $ip/(sqrt($s1)*sqrt($s2));
	
	
	return $d;
}

exit(0);

